import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios';
import { useUserStore } from '@/store/user';
import { ElMessage, ElMessageBox } from 'element-plus';
import router from '@/router';
import { addPendingRequest, removePendingRequest } from './requestOptimize';

// 创建 axios 实例
const service = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API,
  timeout: 600000,
});

// =========================================================================
// 请求拦截器 (Request Interceptor)
// =========================================================================
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    // 1. 防止重复请求
    addPendingRequest(config);

    // 2. 添加 Token
    try {
      // 在拦截器函数内部获取 store 实例，确保 Pinia 已被激活
      const userStore = useUserStore();
      if (userStore.token) {
        if (!config.headers) {
          config.headers = {};
        }
        // --- 核心修改在这里 ---
        // 使用标准的 'Authorization' 请求头，并添加 'Bearer ' 前缀
        // 这是 RESTful API 的最佳实践
        // config.headers['Authorization'] = `Bearer ${userStore.token}`;
        // config.headers['Authorization'] = userStore.token; // <--- 直接发送 token，不带前缀
config.headers['token'] = userStore.token;
        // 如果你的后端确认只认 'token'，你可以保留下面的写法
        // config.headers['token'] = userStore.token;
      }
    } catch (error) {
      // 如果 Pinia 还没初始化 (例如在 store 外部的 JS 模块中使用)，
      // 这里会捕获错误，防止应用崩溃。
      console.warn('Pinia store not available yet. Request sent without token.');
    }

    return config as any;
  },
  (error) => {
    console.error('[Request Interceptor Error]:', error);
    return Promise.reject(error);
  }
);

// =========================================================================
// 响应拦截器 (Response Interceptor)
// =========================================================================
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 1. 请求成功，从 pending 中移除
    if (response.config) {
        removePendingRequest(response.config);
    }

    const res = response.data;

    // 2. 直接返回整个响应体
    // 我们不再在这里判断 res.code === 1。
    // 将业务逻辑判断的权力交还给调用 API 的地方 (例如 store 或组件)。
    // 这样做更灵活，因为不是所有的 API 成功都一定是 code: 1。
    return res;
  },
  (error) => {
    // 1. 如果是主动取消的请求，则不弹出错误提示
    if (axios.isCancel(error)) {
        console.log('Request canceled:', error.message);
        return new Promise(() => {});
    }

    // 2. 请求失败，也从 pending 中移除
    if (error.config) {
        removePendingRequest(error.config);
    }

    // --- 核心修改在这里 ---
    // 3. 统一处理 HTTP 网络错误 (如 401, 404, 500)
    let errorMessage = error.message;
    if (error.response) {
      // 服务器返回了错误状态码
      switch (error.response.status) {
        case 401:
          // 401 Unauthorized: token 失效处理
          const userStore = useUserStore();
          // 避免重复弹出确认框
          if (!document.querySelector('.el-message-box__wrapper')) {
            ElMessageBox.confirm('您的登录已过期，请重新登录', '登录失效', {
              confirmButtonText: '重新登录',
              cancelButtonText: '取消',
              type: 'warning',
            }).then(() => {
              userStore.logout().then(() => {
                location.reload(); // 重新加载页面以清除所有状态
              });
            });
          }
          errorMessage = '登录已过期，请重新登录';
          break;
        case 404:
          errorMessage = '请求的资源未找到 (404)';
          break;
        case 500:
          errorMessage = '服务器内部错误 (500)';
          break;
        default:
          errorMessage = `HTTP 错误: ${error.response.status}`;
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应 (例如网络断开)
      errorMessage = '网络连接失败，请检查您的网络';
    }

    ElMessage({
      message: errorMessage,
      type: 'error',
      duration: 5 * 1000,
    });

    return Promise.reject(error);
  }
);

export default service;
